package com.nathan.crm.service;

import com.nathan.base.BaseService;
import com.nathan.crm.dao.CustomerServeMapper;
import com.nathan.crm.dao.UserMapper;
import com.nathan.crm.enums.CustomerServeStatus;
import com.nathan.crm.utils.AssertUtil;
import com.nathan.crm.vo.CustomerServe;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;

@Service
public class CustomerServeService extends BaseService<CustomerServe,Integer> {

    @Resource
    private CustomerServeMapper customerServeMapper;
    @Resource
    private UserMapper userMapper;

    /**
     * 添加创建服务
     * @param customerServe
     */
    @Transactional(rollbackFor = Exception.class)
    public void addCreateServe(CustomerServe customerServe) {
        /* 参数校验 */
        checkCreateServeParams(customerServe.getCustomer(),customerServe.getServiceRequest(),customerServe.getServeType(),customerServe.getOverview());

        /* 执行添加操作 */
        customerServe.setCreateDate(new Date());
        customerServe.setUpdateDate(new Date());

        customerServeMapper.insertSelective(customerServe);
    }

    /**
     * 参数校验
     * @param customer
     * @param serviceRequest
     * @param serveType
     * @param overview
     */
    private void checkCreateServeParams(String customer, String serviceRequest, String serveType, String overview) {
        AssertUtil.isTrue(StringUtils.isBlank(customer),"请输入客户名！");
        AssertUtil.isTrue(StringUtils.isBlank(serviceRequest),"请输入服务内容！");
        AssertUtil.isTrue(StringUtils.isBlank(overview),"请输入服务概要！");
        AssertUtil.isTrue(StringUtils.isBlank(serveType),"请选择服务类型！");
    }

    /**
     * 更新服务
     *  1、参数校验
     *      客户服务ID  非空,记录必须存在
     *      客户服务状态
     *          如果服务状态为 服务分配状态  fw_002
     *              分配人 非空，分配用户记录存在
     *              分配时间    系统当前时间
     *          如果服务状态为 服务处理状态  fw_003
     *              服务处理内容  非空
     *              服务处理时间  系统当前时间
     *          如果服务状态是 服务反馈状态  fw_004
     *              服务反馈内容  非空
     *              服务满意度   非空
     *              服务状态
     *                  设置为服务归档状态 fw_005
     *  2、执行更新操作，判断受影响的行数
     * @param customerServe
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateCustomerServe(CustomerServe customerServe){
        /* 1、参数校验 */
        // 判断服务状态
        if (CustomerServeStatus.ASSIGNED.getState().equals(customerServe.getState())){
            // 服务分配
            // 分配人 非空，分配用户记录存在
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getAssigner()),"请选择要分配的人！");
            AssertUtil.isTrue(userMapper.selectByPrimaryKey(Integer.parseInt(customerServe.getAssigner())) == null,"分配人不存在！");
            // 分配时间    系统当前时间
            customerServe.setAssignTime(new Date());
        }else if (CustomerServeStatus.PROCED.getState().equals(customerServe.getState())){
            // 服务处理
            // 服务处理内容  非空
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getServiceProce()),"服务处理不能为空！");
            // 服务处理时间  系统当前时间
            customerServe.setServiceProceTime(new Date());
        }else {
            // 服务反馈
            // 服务反馈内容  非空
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getServiceProceResult()),"服务反馈内容不能为空！");
            // 服务满意度   非空
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getMyd()),"请填写满意度！");
        }

        /* 2、执行更新操作 */
        AssertUtil.isTrue(customerServeMapper.updateByPrimaryKeySelective(customerServe) != 1,"服务分配失败！");
    }
}
